﻿#include "widget.h"
#include "ui_widget.h"
#include <QSqlDatabase>
#include <QDebug>
#include <QMessageBox>
#include <QSqlError>
#include <QSqlQuery>
#include <QSqlRecord>
#include <QItemSelectionModel>

/*
 * 先创建一个test的表，然后插入数据在进行操作，数据只要插入一次，创建表失败则返回
 * 增加按钮则增加空行，可自己编辑内容，但是必须按下确定按钮才可生效
 * 删除按钮删除所选行，同样必须按下确定按钮才可生效
 * 查找按钮查找名字是输入框中的名字的数据
 * 显示全部数据按钮是防止出现查找数据不显示所有数据的问题
 * 如果采用Qt启动程序，则需要把shadow build的勾选目录去掉
*/
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    initSql();
    initModel();
}

Widget::~Widget()
{
    delete ui;
}

void Widget::initSql()
{
    //打印Qt支持的数据库驱动
    qDebug() << QSqlDatabase::drivers();

    //添加Sqlite数据库
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    //连接数据库
    db.setDatabaseName("./info.db");

    //打开数据库
    if(!db.open()) //数据库打开失败
    {
        QMessageBox::warning(this, "error", db.lastError().text());
        return;
    }

    //插入数据
    QSqlQuery query;
    bool isOk = query.exec("create table test(id int primary key, name varchar(255), age int, score int);");
    if(!isOk)
    {
        qWarning() << "Create table test error!";
        return;
    }
    query.prepare("insert into test(id, name, age, score) values(?, ?, ?, ?)");
    QVariantList idlist = {1, 2, 3, 4, 5};
    QVariantList nameList = { "student1", "student2", "student3", "student4", "student5"};
    QVariantList ageList = { 22, 23, 24, 25, 26};
    QVariantList scoreList = { 55, 66, 77, 88, 99};

    //给字段绑定相应的值 按顺序绑定
    query.addBindValue(idlist);
    query.addBindValue(nameList);
    query.addBindValue(ageList);
    query.addBindValue(scoreList);
    query.execBatch();

    query.exec("select * from test");

    //遍历打印内容
    while(query.next())
    {
        qWarning() << query.value(0).toInt()
                 << query.value("name").toString()
                 << query.value("age").toInt()
                 << query.value("score").toInt();
    }
}

void Widget::initModel()
{
    m_pModel = new QSqlTableModel(this);
    m_pModel->setTable("test");
    ui->tableView->setModel(m_pModel);

    //显示数据
    m_pModel->select();
    m_pModel->setHeaderData(0, Qt::Horizontal, "index");

    //设置model的编辑模式，必须确认才能提交修改
    m_pModel->setEditStrategy(QSqlTableModel::OnManualSubmit);
//    ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
}

void Widget::on_btnAdd_clicked()
{
    //获取一个空行
    QSqlRecord record = m_pModel->record();
    int row = m_pModel->rowCount();
    //把获取的空行塞入
    m_pModel->insertRecord(row, record);
}

void Widget::on_btnDel_clicked()
{
    //获取索引
    QItemSelectionModel *pModel = ui->tableView->selectionModel();
    QModelIndexList list = pModel->selectedRows();
    //删除选中行
    for(int i = 0; i < list.size(); i++)
    {
        m_pModel->removeRow(list.at(i).row());
    }
}

void Widget::on_btnOk_clicked()
{
    //提交改变
    m_pModel->submitAll();
}

void Widget::on_btnCancel_clicked()
{
    //不提交，相当于回滚
    m_pModel->revertAll();
    m_pModel->submitAll();
}

void Widget::on_btnFind_clicked()
{
    QString name = ui->lineEdit->text();
    QString str = QString("name = '%1'").arg(name);

    m_pModel->setFilter(str);
    m_pModel->select();
}

void Widget::on_btnShow_clicked()
{
    ui->lineEdit->clear();
    m_pModel->setTable("test");
    m_pModel->select();
}
